from flask import request, redirect, url_for, current_app, g
from application import app
from web.models.user import User
from common.libs.UserService import UserService
import re
from common.libs.logservice import LogService


# 检验用户是否登录
def check_login():
    """判断用户是否登录"""
    g.current_user = None
    cookie = request.cookies
    auth_key = app.config["AUTH_COOKIE_NAME"]
    auth_cookie = cookie[auth_key] if auth_key in cookie else ""
    if not auth_cookie:
        return False  # 没有登录
    # 有登录状态，但是还要判断是不是满足条件
    auth_info = auth_cookie.split("#")
    if len(auth_info) != 2:
        return False
    try:
        user_info = User.query.filter_by(uid=auth_info[-1]).first()
    except:
        return False

    # 判断密码
    authcode = UserService.genAuthCode(user_info)
    if auth_info[0] != authcode:
        return False
    g.current_user = user_info
    return user_info

# 添加拦截器
@app.before_request
def before_request():
    """拦截器"""
    path = request.path  # 获取请求路径
    # 忽略的url，请求，不需要登录验证的请求或者路由
    ignore_urls = current_app.config["IGNORE_URLS"]
    ignore_check_login_urls = current_app.config["IGNORE_CHECK_LOGIN_URLS"]
    api_ignore_urls = current_app.config["API_IGNORE_URLS"]
    ignore_merge = ignore_urls + ignore_check_login_urls + api_ignore_urls  # 所有的url
    # print('过滤的路由：', ignore_merge)
    pattern = re.compile("|".join(ignore_merge))
    if pattern.match(path):
        return None  # return None不做拦截
    # 以下则是需要拦截验证的路由或者请求
    user_info = check_login()  # 登录校验
    if not user_info:  # 没有登录
        # 重定向到登录页面
        return redirect(url_for('user_page.login'))
    # 把当前登录的用户信息写入到g对象中
    g.current_user = user_info

    # 添加访问日志服务
    LogService.addAccesslog()
    return None  # return None不做拦截


